package com.yixiu.modules.db.datasources;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import java.util.Map;


/**
 * 通过继承抽象类AbstractRoutingDataSource实现多数据源 参考https://blog.csdn.net/laojiaqi/article/details/78964862
 *
 */

public class DynamicDataSource extends AbstractRoutingDataSource {

    // 为每个线程创建一个本地变量    用法参考： http://www.cnblogs.com/dolphin0520/p/3920407.html
    // 有关static final的用法，参考 https://www.cnblogs.com/qducn/p/6140492.html
    private static final ThreadLocal<String> dataSourceKey = new ThreadLocal<String>();


    /**
     * 定义构造函数
     * @param defaultTargetDataSource 表示默认的连接
     * @param targetDataSources 保存了key和数据库连接的映射关系
     */
    public  DynamicDataSource(Object defaultTargetDataSource, Map<Object, Object> targetDataSources) {
        // 设置默认数据源
        super.setDefaultTargetDataSource(defaultTargetDataSource);
        super.setTargetDataSources(targetDataSources);
        super.afterPropertiesSet();  // 解析targetDataSources，获取resolvedDataSources(存储的结构也是数据库标识和数据源的映射关系)
    }

    /**
     * 重载查找数据源Key的方法
     * 在抽象类AbstractRoutingDataSource中的方法determineTargetDataSource，会调用determineCurrentLookupKey，先获取数据源Key,再由key获取数据源
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        // 决定返回哪一个数据源
        return  getDataSource();
    }


    public  static void clearDataSource() {
        dataSourceKey.remove();
    }
    public  static void setDataSource(String dataSource) {
        dataSourceKey.set(dataSource);
    }

    public  static String getDataSource() {
        return dataSourceKey.get();
    }

}
